from functools import reduce
import re, copy
import random, base64, hashlib
from Common.com_func import log


def dict_list_duplicate_removal_1(dict_list):
    """
        字典 - 列表 去重（ 针对完全相同的字典 ）

        reduce() 函数
        把一个函数作用在一个序列上，这个函数必须接收两个参数，reduce把结果继续和序列的下一个元素做累积计算
        reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
    """
    # # 添加一个'空列表'作为'字典列表'的第一个元素
    # new_dict_list = [[]] + dict_list
    #
    # # 提供一个匿名函数：
    # #   判断 第二个'字典参数'是否包含在第一个'列表参数'中，
    # #     若包含：  则返回第一个列表参数，
    # #     若不包含：则将两个参数合并成列表后返回
    # func = lambda list_1, dict_2: list_1 if dict_2 in list_1 else list_1 + [dict_2]
    #
    # # 使用 reduce() 函数：将匿名函数中返回的结果 与 字典列表的下一个元素 做计算
    # return reduce(func, new_dict_list)

    return reduce(lambda x, y: x if y in x else x + [y], [[]] + dict_list)


def dict_list_duplicate_removal_2(dict_list, key):
    """
        字典 - 列表 去重（ 针对字典元素'key'进行去重 ）
    """
    # # 添加一个'空列表'作为'字典列表'的第一个元素
    # new_dict_list = [[]] + dict_list
    #
    # # 提供一个匿名函数：
    # #   判断 第二个'字典参数'的某个key对应的value 是否包含在 第一个'列表参数'中的该key的列表 中
    # #     若包含：  则返回第一个列表参数，
    # #     若不包含：则将两个参数合并成列表后返回
    # func = lambda list_1, dict_2: list_1 if dict_2[key] in map(lambda i: i[key], list_1) else list_1 + [dict_2]
    #
    # # 使用 reduce() 函数：将匿名函数中返回的结果 与 字典列表的下一个元素 做计算
    # return reduce(func, new_dict_list)

    return reduce(lambda x, y: x if y[key] in map(lambda i: i[key], x) else x + [y], [[]] + dict_list)


def capture_str_variable(str, v_tag):
    """
        捕获字符串中 指定标记的变量
        eg: "/DeployApi/swagger_test_01/{number}/{age}"
         -> ["number", "age"]

    :param: str
    :param: v_tag
    :return: 变量列表
    """
    catpure_list = []
    tag_dict = {"{": "}", "{{": "}}", "<": ">", "<<": ">>", "[": "]", "[[": "]]", "=": "&"}
    v_pair = tag_dict.get(v_tag, None)
    if v_pair:
        num = str.count(v_tag)  # 统计参数的依赖字段数量
        if v_pair == "]" or v_pair == "]]":
            v_tag = f"\{v_tag}"
            v_pair = f"\{v_pair}"
        pattern = (r".*" + v_tag + "(.*)" + v_pair) * num  # 整理匹配模式（捕获数量）-> r".*{(.*)}" * num
        if pattern:  # 若存在 则进行捕获
            match_obj = re.match(pattern, str)
        for i in range(num):
            catpure_list.append(match_obj.group(i + 1))
    return catpure_list


def md5(field):
    """
        MD5(str) 32位小写
    """
    md5 = hashlib.md5()
    md5.update(str(field).encode("utf-8"))
    return md5.hexdigest()


if __name__ == '__main__':

    # dict_list_1 = [{"a": "111", "b": "222"}, {"a": "111", "b": "222"}, {"a": "222", "b": "333"}]
    # dict_list_1 = dict_list_duplicate_removal_1(dict_list=dict_list_1)
    # print(dict_list_1)
    # print()
    # dict_list_2 = [{"a": "111", "b": "777"}, {"a": "111", "b": "888"}, {"a": "222", "b": "999"}]
    # dict_list_2 = dict_list_duplicate_removal_2(dict_list=dict_list_2, key="a")
    # print(dict_list_2)

    url = "/DeployApi/swagger_test_01/[number]/[age]"
    test = ["aaa", "bbb"]
    param_list = capture_str_variable(str=url, v_tag="[")
    test.extend(param_list)
    print(test)
    #
    # aaa = "?id=55555555555&hehe=1111"
    # bbb = "?id=&hehe="
    #
    # p_list = capture_str_variable(str=aaa+"&", v_tag="=")
    # for p in p_list:
    #     aaa = aaa.replace(p, "")
    # print(aaa)



